const { DataTypes } = require("sequelize");
const sequelize = require("./db");
const User = require("./User");
const Shop = require("./Shop");
const Merchandise = require("./Merchandise");
// 导出订单表
const Order = sequelize.define(
	"Order",
	{
    // 订单id
		id: {
			type: DataTypes.BIGINT, // 使用 BIGINT 类型
    	autoIncrement: true, // 自增
			primaryKey: true,
		},
    // 订单号 规则 M yyyy+mm+dd+0001～9999
		no: {
			type: DataTypes.STRING,
			allowNull: false,
		},
    // 订单所属用户id
    userId: {
			type: DataTypes.STRING(50),
			allowNull: false,
			references: {
				model: User, // 关联的模型
				key: 'id', // 关联的字段
			},
		},
    // 订单所属商家id
    shopId: {
			type: DataTypes.STRING(50),
			allowNull: false,
			references: {
				model: Shop, // 关联的模型
				key: 'id', // 关联的字段
			},
		},
		// 商品id
		merchandiseId: {
			type: DataTypes.BIGINT,
			allowNull: false,
			references: {
				model: Merchandise, // 关联的模型
				key: 'id', // 关联的字段
			},
		},
		// 商品数量
		count: {
			type: DataTypes.INTEGER,
			allowNull: false,
			defaultValue: 1,
		},
		// 订单金额
		orderPrice: {
			type: DataTypes.FLOAT(10, 2),
			allowNull: false,
			defaultValue: 0.00,
		},
    // 订单信息
		info: {
			type: DataTypes.STRING(100),
			allowNull: false,
		},
    // 订单状态 等待0 成功1 失败2
    orderState: {
			type: DataTypes.INTEGER,
			allowNull: false,
			defaultValue: 0,
			validate: {
				isIn: {
					args: [[0, 1, 2]],
					msg: "orderState must be either 0, 1 or 2"
				}
			}
		},
		// 订单类型 0:购买 1:出售
		orderType: {
			type: DataTypes.INTEGER,
			allowNull: false,
			defaultValue: 0,
			validate: {
				isIn: {
					args: [[0, 1]],
					msg: "orderType must be either 0 or 1"
				}
			}
		}
	},
	{
		// createdAt: false, // 不使用创建日期字段
		// updatedAt: false, //不使用更新日期字段
		paranoid: true, // 删除时间开启
	}
);

// 定义外键关系
User.hasMany(Order, {
	foreignKey: 'userId',
	as: 'orders',
});

Order.belongsTo(User, {
	foreignKey: 'userId',
	as: 'users',
});

Shop.hasMany(Order, {
	foreignKey: 'shopId',
	as: 'orders',
});

Order.belongsTo(Shop, {
	foreignKey: 'shopId',
	as: 'shops',
});

Merchandise.hasMany(Order, {
	foreignKey: 'merchandiseId',
	as: 'orders',
});

Order.belongsTo(Merchandise, {
	foreignKey: 'merchandiseId',
	as: 'merchandises',
});

module.exports = Order